package uva.sc.ql.gui.questions; import java.awt.Component; import java.awt.Dimension; import java.awt.GridLayout; import java.util.List; import java.util.Map; import java.util.Map.Entry; import javax.swing.Box; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import uva.sc.ql.atom.ID; import uva.sc.ql.evaluator.QuestionsPropertiesVisitor; import uva.sc.ql.expression.Expression; import uva.sc.ql.gui.helpers.QuestionData; import uva.sc.ql.gui.listeners.CalculatorListener; @SuppressWarnings({ "serial", "rawtypes" }) public class CalculatedQuestion extends Question { private Map<ID, List<ID>> patronElements; private QuestionsPropertiesVisitor questionProperties; private List<Component> componentList; public CalculatedQuestion(Map<ID, List<ID>> patronElements, QuestionsPropertiesVisitor questionProperties, List<Component> componentList) { this.patronElements = patronElements; this.questionProperties = questionProperties; this.componentList = componentList; } public JPanel drawQuestion(ID id, String label, boolean editable) { QuestionData data = questionProperties.questionData(id); boolean visibility = data.evaluateVisibility(questionProperties .getValuesTable()); JTextField textField = createTextField(id, editable, data); return generatePanel(id, label, visibility, textField); } private JTextField createTextField(ID id, boolean editable, QuestionData data) { JTextField textField = new JTextField(); String value = calculateText(data); textField.setText(value); textField.setEditable(editable); textField.setName(id.getValue()); addListeners(id, textField); return textField; } private String calculateText(QuestionData data) { String value = ""; Expression expr = data.evaluateValue(questionProperties .getValuesTable()); if (expr != null) { value = expr.toString(); } return value; } private JPanel generatePanel(ID id, String label, boolean visibility, JTextField textField) { JPanel panel = new JPanel(); panel.setLayout(new GridLayout(2, 0)); panel.add(new JLabel(label)); panel.add(Box.createRigidArea(new Dimension(0, 5))); panel.add(textField); panel.setName(id.getValue()); panel.setVisible(visibility); return panel; } private void addListeners(ID id, JTextField textField) { for (Entry<ID, List<ID>> entry : patronElements.entrySet()) { addListener(id, textField, entry); } } private void addListener(ID id, JTextField textField, Entry<ID, List<ID>> entry) { if (id.equals(entry.getKey())) { textField.getDocument().addDocumentListener( (new CalculatorListener(patronElements, questionProperties, componentList, textField, id))); } } }